热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

也就是|小窗_卷积的特征提取与参数计算

篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den

篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。


Dense和Conv2D根本区别在于,Dense层从输入空间中学到的是全局模式,比如对于MNIST数字来说,全局模式就是涉及所有像素的模式。而Conv2D学到的是局部模式(local pattern),同样以MNIST为例,Conv2D学到的是在输入图像的小窗口中发现的模式(pattern)。

这个重要特性使卷积神经网络具有两个有趣的性质:

1. 卷积神经网络学到的模式具有平移不变性。卷积神经网络在图像右下角学到某个模式后,它可以在任何地方识别这个模式,比如左上角。但是对于Dense网络来说,如果模式出现在新的位置那么必须重新学习这个模式。这使得卷积神经网络在处理图像时可以更高效的利用数据。

2. 卷积神经网络可以学到模式的空间层次结构。如下图所示,第一个卷积层将学习较小的局部模式(比如边缘),第二个卷积层将学习由第一个层的特征们组成的更大的模式,以此类推,使得卷积神经网络可以学习越来越复杂,越来越抽象的视觉概念。

对于MINST,第一个卷积层接收一个大小为(28,28,1)的输入特征图。为了通过卷积从该输入特征图中提取不同的局部模式,我们要设计不同的卷积核。每个卷积核的大小宽高多为3*3或者5*5,卷积核的深度与输入特征图的深度一致,卷积核的个数与这一层需要获得的局部模式数量一致。每一个卷积核也成为一个滤波器,通过滤波器的过滤(filter),就学到了一个局部模式(特征)。例如,我设计的第一个卷积层希望从这张图片中获取32种局部模式,那么我就要设计32个(3*3*1)的卷积核,经过第一层过滤后,会形成一个(26*26*32)的输出特征图。每个过滤器与输入特征图进行卷积运算会得到一个(26*26)的响应图(response map),32个过滤器就会得到(26*26*32)这样输出特征图。

所以,特征图深度方向上的每一个维度都是一个特征(过滤器),而每一个维度上的2D张量是该维度过滤器对输入的响应所形成的二维空间图(map)。

 现在,对第一次卷积层得到的(26*26*32)特征图进行一次最大值池化(MaxPooling),经过池化的特征数量变为(13*13*32)。随后设计第二个卷积层,对于第二个卷积层而言输入的特征图就是(13,13,32),那么第二个卷积层的卷积核深度也应该是32,也就是(3,3,32),比如第二个卷积层我想提取64个特征,那么就意味着这一层经过运算后,输出的特征图为(11,11,64),随后是针对第二层卷积输出的最大值池化,经过池化的特征数量变为(5,5,64),然后可以设计第三个卷积层,那么根据输入特征图的深度,第三个卷积层的卷积核深度为64,也就是(3,3,64),比如第三个卷积层我也想提取64个特征,那么就意味着这一层经过运算后,输出的特征图为(3,3,64)。经过第三次卷积后,将输出内容可以与Dense层连接,然后分类输出。当然在于Dense层连接前,需要将3维数据“抻平”,变为一维数据才能输入到Dense层。最终我们以代码的形式来设计一下文中所述的神经网络:

from tensorflow import keras
from tensorflow.keras import models
from tensorflow.keras import layers
from tensorflow.keras import datasets
from tensorflow.keras import utils
mymodel = models.Sequential()
mymodel.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)))
mymodel.add(layers.MaxPooling2D(2,2))
mymodel.add(layers.Conv2D(64,(3,3),activation='relu'))
mymodel.add(layers.MaxPooling2D(2,2))
mymodel.add(layers.Conv2D(64,(3,3),activation='relu'))
mymodel.add(layers.Flatten())
mymodel.add(layers.Dense(64,activation='relu'))
mymodel.add(layers.Dense(10,activation='softmax'))
mymodel.summary()

 模型的summary函数会返回每个层的参数量:



_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 conv2d (Conv2D)             (None, 26, 26, 32)        320


 max_pooling2d (MaxPooling2D  (None, 13, 13, 32)       0
 )


 conv2d_1 (Conv2D)           (None, 11, 11, 64)        18496


 max_pooling2d_1 (MaxPooling  (None, 5, 5, 64)         0
 2D)


 conv2d_2 (Conv2D)           (None, 3, 3, 64)          36928


 flatten (Flatten)           (None, 576)               0


 dense (Dense)               (None, 64)                36928


 dense_1 (Dense)             (None, 10)                650


如果能理解卷积网络层中核的形状和个数,那么每一层的参数就不难理解了。



 conv2d (Conv2D)             (None, 26, 26, 32)        320


第一个卷积层的卷积核大小为(3,3,1),共32个,所以w = 3*3*1*32 = 288,有w就会有偏置b,一维向量共32个元素。所以一共有320个参数。 



 conv2d_1 (Conv2D)           (None, 11, 11, 64)        18496


第二个卷积层的卷积核大小为(3,3,32),共64个,所以w = 3 * 3 *32 * 64 =  18432,还有偏置b中的64个变量,所以一共有18496个参数。



 conv2d_2 (Conv2D)           (None, 3, 3, 64)          36928


第三个卷积层的卷积核大小为(3,3,64),共64个,所以w = 3 * 3 *64 * 64 =  36864,还有偏置b中的64个变量,所以一共有36928个参数。



 dense (Dense)               (None, 64)                36928


输入层维度为576(把(3,3,64)给抻平),输出层维度是64,所以w是 576*64 = 36864,再加上偏置向量中的64个元素,所以一共有36928个参数。



 dense_1 (Dense)             (None, 10)                650


最后一个Dense层,输入为64,输出是10,所以w是64*10 = 640,最后再加上10个偏置,所以一共有650个参数。

整个神经网络的参数总数为93322个。

(train_img,train_labels),(test_img,test_labels) = datasets.mnist.load_data()
train_img = train_img.reshape((60000,28,28,1))
train_img = train_img.astype('float32')/255
test_img = test_img.reshape((10000,28,28,1))
test_img = test_img.astype('float32')/255
train_labels = utils.to_categorical(train_labels)
test_labels = utils.to_categorical(test_labels)
mymodel.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
mymodel.fit(train_img,train_labels,epochs=5,batch_size=64)
myloss,myaccuracy =mymodel.evaluate(test_img,test_labels)
print(f'模型测试准确率:myaccuracy')

最终在测试集上得到的准确率为0.9912999868392944。

相较于单纯使用Dense进行组网准确率还是有明显上升的(纯Dense组网的准确率在97%以上)。


推荐阅读
  • 本文详细介绍了使用NumPy和TensorFlow实现的逻辑回归算法。通过具体代码示例,解释了数据加载、模型训练及分类预测的过程。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • 本文探讨了图像标签的多种分类场景及其在以图搜图技术中的应用,涵盖了从基础理论到实际项目实施的全面解析。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 本文档旨在帮助开发者回顾游戏开发中的人工智能技术,涵盖移动算法、群聚行为、路径规划、脚本AI、有限状态机、模糊逻辑、规则式AI、概率论与贝叶斯技术、神经网络及遗传算法等内容。 ... [详细]
  • 本文介绍了一个使用Keras框架构建的卷积神经网络(CNN)实例,主要利用了Keras提供的MNIST数据集以及相关的层,如Dense、Dropout、Activation等,构建了一个具有两层卷积和两层全连接层的CNN模型。 ... [详细]
  • TensorFlow 2.0 中的 Keras 数据归一化实践
    数据预处理是机器学习任务中的关键步骤,特别是在深度学习领域。通过将数据归一化至特定范围,可以在梯度下降过程中实现更快的收敛速度和更高的模型性能。本文探讨了如何使用 TensorFlow 2.0 和 Keras 进行有效的数据归一化。 ... [详细]
  • TensorFlow核心函数解析与应用
    本文详细介绍了TensorFlow中几个常用的基础函数及其应用场景,包括常量创建、张量扩展以及二维卷积操作等,旨在帮助开发者更好地理解和使用这些功能。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • 本文介绍了一种根据目标检测结果,从原始XML文件中提取并分析特定类别的方法。通过解析XML文件,筛选出特定类别的图像和标注信息,并保存到新的文件夹中,以便进一步分析和处理。 ... [详细]
  • Keras 实战:自编码器入门指南
    本文介绍了使用 Keras 框架实现自编码器的基本方法。自编码器是一种用于无监督学习的神经网络模型,主要功能包括数据降维、特征提取等。通过实际案例,我们将展示如何使用全连接层和卷积层来构建自编码器,并讨论不同维度对重建效果的影响。 ... [详细]
  • 在Ubuntu 16.04中使用Anaconda安装TensorFlow
    本文详细介绍了如何在Ubuntu 16.04系统上通过Anaconda环境管理工具安装TensorFlow。首先,需要下载并安装Anaconda,然后配置环境变量以确保系统能够识别Anaconda命令。接着,创建一个特定的Python环境用于安装TensorFlow,并通过指定的镜像源加速安装过程。最后,通过一个简单的线性回归示例验证TensorFlow的安装是否成功。 ... [详细]
  • 回顾与学习是进步的阶梯。再次审视卷积神经网络(CNNs),我对之前不甚明了的概念有了更深的理解。本文旨在分享这些新的见解,并探讨CNNs在图像识别和自然语言处理等领域中的实际应用。 ... [详细]
  • 李宏毅机器学习笔记:无监督学习之线性方法
    无监督学习主要涵盖两大类别:一是聚类与降维,旨在简化数据结构;二是生成模型,用于从编码生成新的数据样本。本文深入探讨了这些技术的具体应用和理论基础。 ... [详细]
  • 大数据时代的机器学习:人工特征工程与线性模型的局限
    本文探讨了在大数据背景下,人工特征工程与线性模型的应用及其局限性。随着数据量的激增和技术的进步,传统的特征工程方法面临挑战,文章提出了未来发展的可能方向。 ... [详细]
author-avatar
mobiledu2502856013
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有